{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Symbolic Image Filtering"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "import pymbolic.primitives as p\n",
    "\n",
    "u_var = p.Variable(\"u\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Want to define an image filter.\n",
    "\n",
    "----\n",
    "\n",
    "To that end, define a new formula 'thing': A neighbor-average."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "NeighborAverage(Variable('u'))"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "class NeighborAverage(p.Expression):\n",
    "    def __init__(self, child):\n",
    "        self.child = child\n",
    "        \n",
    "    def __getinitargs__(self):\n",
    "        return (self.child,)\n",
    "    \n",
    "    mapper_method = \"map_neighbor_average\"\n",
    "        \n",
    "img_filter = NeighborAverage(u_var)\n",
    "#img_filter = u_var + u_var - NeighborAverage(u_var)\n",
    "\n",
    "img_filter"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's define some indexing variables:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "from pymbolic.mapper import IdentityMapper\n",
    "\n",
    "i = p.Variable(\"i\")\n",
    "j = p.Variable(\"j\")\n",
    "\n",
    "ii = i+1\n",
    "jj = j+1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "class IndexMapper(IdentityMapper):\n",
    "    def map_variable(self, expr):\n",
    "        return expr[ii, jj]\n",
    "    \n",
    "    def map_neighbor_average(self, expr):\n",
    "        var = expr.child\n",
    "        return (2*var[ii,jj] + var[ii+1,jj] + var[ii-1,jj]\n",
    "                + var[ii,jj+1] + var[ii,jj-1])/6"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now apply this to our filter:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2*u[i + 1, j + 1] + u[i + 1 + 1, j + 1] + u[i + 1 + -1, j + 1] + u[i + 1, j + 1 + 1] + u[i + 1, j + 1 + -1]) / 6\n"
     ]
    }
   ],
   "source": [
    "idx_mapper = IndexMapper()\n",
    "print(idx_mapper(img_filter))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "----\n",
    "\n",
    "Now let's generate some code for this, using `loopy`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "import loopy as lp\n",
    "from loopy.version import LOOPY_USE_LANGUAGE_VERSION_2018_2\n",
    "\n",
    "result_var = p.Variable(\"result\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Observe the two parts of the `loopy` kernel description:\n",
    "\n",
    "* Polyhedral loop domain\n",
    "* Instructions `[lp.ExpressionInstruction()]`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "#clear\n",
    "knl = lp.make_kernel(\n",
    "    \"{[i,j]: 0<=i,j<n}\",\n",
    "    [lp.Assignment(\n",
    "            result_var[ii,jj], idx_mapper(img_filter))],\n",
    "    [lp.GlobalArg(\"result\", shape=\"n+2, n+2\"), ...]\n",
    "    )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Kernels can always be inspected--simply use `print`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "---------------------------------------------------------------------------\n",
      "KERNEL: loopy_kernel\n",
      "---------------------------------------------------------------------------\n",
      "ARGUMENTS:\n",
      "n: ValueArg, type: <auto/runtime>\n",
      "result: type: <auto/runtime>, shape: (n + 2, n + 2), dim_tags: (N1:stride:n + 2, N0:stride:1) aspace: global\n",
      "u: type: <auto/runtime>, shape: (2 + n, 2 + n), dim_tags: (N1:stride:2 + n, N0:stride:1) aspace: global\n",
      "---------------------------------------------------------------------------\n",
      "DOMAINS:\n",
      "[n] -> { [i, j] : 0 <= i < n and 0 <= j < n }\n",
      "---------------------------------------------------------------------------\n",
      "INAME IMPLEMENTATION TAGS:\n",
      "i: None\n",
      "j: None\n",
      "---------------------------------------------------------------------------\n",
      "INSTRUCTIONS:\n",
      "for j, i\n",
      "    \u001b[36mresult[i + 1, j + 1]\u001b[0m = \u001b[35m(2*u[i + 1, j + 1] + u[i + 1 + 1, j + 1] + u[i + 1 + -1, j + 1] + u[i + 1, j + 1 + 1] + u[i + 1, j + 1 + -1]) / 6\u001b[0m  {id=\u001b[32minsn\u001b[0m}\n",
      "end j, i\n",
      "---------------------------------------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "print(knl)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "----\n",
    "\n",
    "Let's move towards running this code. To do so, we need `pyopencl`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Choose platform:\n",
      "[0] <pyopencl.Platform 'Portable Computing Language' at 0x7f87cfbe26e8>\n",
      "[1] <pyopencl.Platform 'Intel(R) OpenCL' at 0x2e90b58>\n"
     ]
    },
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "Choice [0]: \n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Set the environment variable PYOPENCL_CTX='' to avoid being asked again.\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pyopencl as cl\n",
    "import pyopencl.array\n",
    "import pyopencl.clrandom\n",
    "\n",
    "ctx = cl.create_some_context(interactive=True)\n",
    "queue = cl.CommandQueue(ctx)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And some data to work with:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "n = 200\n",
    "\n",
    "import imageio\n",
    "u = imageio.imread(\"cat.jpeg\").astype(np.float32).sum(axis=2)/(3*256)\n",
    "u = cl.array.to_device(queue, u)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x7f879f030970>"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as pt\n",
    "pt.imshow(u.get(), cmap=\"gray\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now run the code, and tell loopy to print what it generates:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[36m#\u001b[39;49;00m\u001b[36mdefine lid(N) ((int) get_local_id(N))\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\u001b[36m#\u001b[39;49;00m\u001b[36mdefine gid(N) ((int) get_group_id(N))\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\n",
      "__kernel \u001b[36mvoid\u001b[39;49;00m \u001b[32m__attribute__\u001b[39;49;00m ((reqd_work_group_size(\u001b[34m1\u001b[39;49;00m, \u001b[34m1\u001b[39;49;00m, \u001b[34m1\u001b[39;49;00m))) loopy_kernel(__global \u001b[36mfloat\u001b[39;49;00m *__restrict__ result, \u001b[36mint\u001b[39;49;00m \u001b[34mconst\u001b[39;49;00m n, __global \u001b[36mfloat\u001b[39;49;00m \u001b[34mconst\u001b[39;49;00m *__restrict__ u)\n",
      "{\n",
      "  \u001b[34mfor\u001b[39;49;00m (\u001b[36mint\u001b[39;49;00m j = \u001b[34m0\u001b[39;49;00m; j <= -\u001b[34m1\u001b[39;49;00m + n; ++j)\n",
      "    \u001b[34mfor\u001b[39;49;00m (\u001b[36mint\u001b[39;49;00m i = \u001b[34m0\u001b[39;49;00m; i <= -\u001b[34m1\u001b[39;49;00m + n; ++i)\n",
      "      result[(n + \u001b[34m2\u001b[39;49;00m) * (\u001b[34m1\u001b[39;49;00m + i) + \u001b[34m1\u001b[39;49;00m + j] = (\u001b[34m2.0f\u001b[39;49;00m * u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m1\u001b[39;49;00m + i) + \u001b[34m1\u001b[39;49;00m + j] + u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m2\u001b[39;49;00m + i) + \u001b[34m1\u001b[39;49;00m + j] + u[(\u001b[34m2\u001b[39;49;00m + n) * i + \u001b[34m1\u001b[39;49;00m + j] + u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m1\u001b[39;49;00m + i) + \u001b[34m2\u001b[39;49;00m + j] + u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m1\u001b[39;49;00m + i) + j]) / \u001b[34m6.0f\u001b[39;49;00m;\n",
      "}\n",
      "\n"
     ]
    }
   ],
   "source": [
    "knl = lp.set_options(knl, write_cl=True)\n",
    "\n",
    "result = cl.array.zeros_like(u)\n",
    "_ = knl(queue, u=u, result=result, n=n)\n",
    "u = result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x7f879d0581f0>"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "pt.imshow(u.get(), cmap=\"gray\", vmin=0, vmax=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "That's obviously not very parallel. Introduce parallelism:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[36m#\u001b[39;49;00m\u001b[36mdefine lid(N) ((int) get_local_id(N))\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\u001b[36m#\u001b[39;49;00m\u001b[36mdefine gid(N) ((int) get_group_id(N))\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\n",
      "__kernel \u001b[36mvoid\u001b[39;49;00m \u001b[32m__attribute__\u001b[39;49;00m ((reqd_work_group_size(\u001b[34m1\u001b[39;49;00m, \u001b[34m1\u001b[39;49;00m, \u001b[34m1\u001b[39;49;00m))) loopy_kernel(__global \u001b[36mfloat\u001b[39;49;00m *__restrict__ result, \u001b[36mint\u001b[39;49;00m \u001b[34mconst\u001b[39;49;00m n, __global \u001b[36mfloat\u001b[39;49;00m \u001b[34mconst\u001b[39;49;00m *__restrict__ u)\n",
      "{\n",
      "  result[(n + \u001b[34m2\u001b[39;49;00m) * (\u001b[34m1\u001b[39;49;00m + gid(\u001b[34m0\u001b[39;49;00m)) + \u001b[34m1\u001b[39;49;00m + gid(\u001b[34m1\u001b[39;49;00m)] = (\u001b[34m2.0f\u001b[39;49;00m * u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m1\u001b[39;49;00m + gid(\u001b[34m0\u001b[39;49;00m)) + \u001b[34m1\u001b[39;49;00m + gid(\u001b[34m1\u001b[39;49;00m)] + u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m2\u001b[39;49;00m + gid(\u001b[34m0\u001b[39;49;00m)) + \u001b[34m1\u001b[39;49;00m + gid(\u001b[34m1\u001b[39;49;00m)] + u[(\u001b[34m2\u001b[39;49;00m + n) * gid(\u001b[34m0\u001b[39;49;00m) + \u001b[34m1\u001b[39;49;00m + gid(\u001b[34m1\u001b[39;49;00m)] + u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m1\u001b[39;49;00m + gid(\u001b[34m0\u001b[39;49;00m)) + \u001b[34m2\u001b[39;49;00m + gid(\u001b[34m1\u001b[39;49;00m)] + u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m1\u001b[39;49;00m + gid(\u001b[34m0\u001b[39;49;00m)) + gid(\u001b[34m1\u001b[39;49;00m)]) / \u001b[34m6.0f\u001b[39;49;00m;\n",
      "}\n",
      "\n"
     ]
    }
   ],
   "source": [
    "tknl = knl\n",
    "tknl = lp.tag_inames(tknl, {\"i\": \"g.0\", \"j\": \"g.1\"})\n",
    "evt, (result,) = tknl(queue, u=u)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "But OpenCL/CUDA require blocking to be efficient!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[36m#\u001b[39;49;00m\u001b[36mdefine lid(N) ((int) get_local_id(N))\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\u001b[36m#\u001b[39;49;00m\u001b[36mdefine gid(N) ((int) get_group_id(N))\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\n",
      "__kernel \u001b[36mvoid\u001b[39;49;00m \u001b[32m__attribute__\u001b[39;49;00m ((reqd_work_group_size(\u001b[34m16\u001b[39;49;00m, \u001b[34m16\u001b[39;49;00m, \u001b[34m1\u001b[39;49;00m))) loopy_kernel(__global \u001b[36mfloat\u001b[39;49;00m *__restrict__ result, \u001b[36mint\u001b[39;49;00m \u001b[34mconst\u001b[39;49;00m n, __global \u001b[36mfloat\u001b[39;49;00m \u001b[34mconst\u001b[39;49;00m *__restrict__ u)\n",
      "{\n",
      "  \u001b[34mif\u001b[39;49;00m (-\u001b[34m1\u001b[39;49;00m + -\u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + -\u001b[34m1\u001b[39;49;00m * lid(\u001b[34m0\u001b[39;49;00m) + n >= \u001b[34m0\u001b[39;49;00m && -\u001b[34m1\u001b[39;49;00m + -\u001b[34m16\u001b[39;49;00m * gid(\u001b[34m1\u001b[39;49;00m) + -\u001b[34m1\u001b[39;49;00m * lid(\u001b[34m1\u001b[39;49;00m) + n >= \u001b[34m0\u001b[39;49;00m)\n",
      "    result[(n + \u001b[34m2\u001b[39;49;00m) * (\u001b[34m1\u001b[39;49;00m + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m1\u001b[39;49;00m) + lid(\u001b[34m1\u001b[39;49;00m)) + \u001b[34m1\u001b[39;49;00m + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + lid(\u001b[34m0\u001b[39;49;00m)] = (\u001b[34m2.0f\u001b[39;49;00m * u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m1\u001b[39;49;00m + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m1\u001b[39;49;00m) + lid(\u001b[34m1\u001b[39;49;00m)) + \u001b[34m1\u001b[39;49;00m + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + lid(\u001b[34m0\u001b[39;49;00m)] + u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m2\u001b[39;49;00m + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m1\u001b[39;49;00m) + lid(\u001b[34m1\u001b[39;49;00m)) + \u001b[34m1\u001b[39;49;00m + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + lid(\u001b[34m0\u001b[39;49;00m)] + u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m16\u001b[39;49;00m * gid(\u001b[34m1\u001b[39;49;00m) + lid(\u001b[34m1\u001b[39;49;00m)) + \u001b[34m1\u001b[39;49;00m + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + lid(\u001b[34m0\u001b[39;49;00m)] + u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m1\u001b[39;49;00m + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m1\u001b[39;49;00m) + lid(\u001b[34m1\u001b[39;49;00m)) + \u001b[34m2\u001b[39;49;00m + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + lid(\u001b[34m0\u001b[39;49;00m)] + u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m1\u001b[39;49;00m + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m1\u001b[39;49;00m) + lid(\u001b[34m1\u001b[39;49;00m)) + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + lid(\u001b[34m0\u001b[39;49;00m)]) / \u001b[34m6.0f\u001b[39;49;00m;\n",
      "}\n",
      "\n"
     ]
    }
   ],
   "source": [
    "sknl = knl\n",
    "sknl = lp.split_iname(sknl,\n",
    "        \"i\", 16, outer_tag=\"g.1\", inner_tag=\"l.1\")\n",
    "sknl = lp.split_iname(sknl,\n",
    "        \"j\", 16, outer_tag=\"g.0\", inner_tag=\"l.0\")\n",
    "evt, (result,) = sknl(queue, u=u)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "How about some data reuse?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[36m#\u001b[39;49;00m\u001b[36mdefine lid(N) ((int) get_local_id(N))\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\u001b[36m#\u001b[39;49;00m\u001b[36mdefine gid(N) ((int) get_group_id(N))\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\n",
      "__kernel \u001b[36mvoid\u001b[39;49;00m \u001b[32m__attribute__\u001b[39;49;00m ((reqd_work_group_size(\u001b[34m16\u001b[39;49;00m, \u001b[34m16\u001b[39;49;00m, \u001b[34m1\u001b[39;49;00m))) loopy_kernel(__global \u001b[36mfloat\u001b[39;49;00m *__restrict__ result, \u001b[36mint\u001b[39;49;00m \u001b[34mconst\u001b[39;49;00m n, __global \u001b[36mfloat\u001b[39;49;00m \u001b[34mconst\u001b[39;49;00m *__restrict__ u)\n",
      "{\n",
      "  __local \u001b[36mfloat\u001b[39;49;00m u_fetch[\u001b[34m18\u001b[39;49;00m * \u001b[34m18\u001b[39;49;00m];\n",
      "\n",
      "  \u001b[34mif\u001b[39;49;00m (\u001b[34m1\u001b[39;49;00m + -\u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + -\u001b[34m1\u001b[39;49;00m * lid(\u001b[34m0\u001b[39;49;00m) + n >= \u001b[34m0\u001b[39;49;00m && \u001b[34m1\u001b[39;49;00m + -\u001b[34m16\u001b[39;49;00m * gid(\u001b[34m1\u001b[39;49;00m) + -\u001b[34m1\u001b[39;49;00m * lid(\u001b[34m1\u001b[39;49;00m) + n >= \u001b[34m0\u001b[39;49;00m)\n",
      "    \u001b[34mfor\u001b[39;49;00m (\u001b[36mint\u001b[39;49;00m u_dim_1_outer = \u001b[34m0\u001b[39;49;00m; u_dim_1_outer <= (-\u001b[34m1\u001b[39;49;00m + n + -\u001b[34m1\u001b[39;49;00m * lid(\u001b[34m1\u001b[39;49;00m) + -\u001b[34m16\u001b[39;49;00m * gid(\u001b[34m1\u001b[39;49;00m) >= \u001b[34m0\u001b[39;49;00m && -\u001b[34m16\u001b[39;49;00m + n + -\u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) >= \u001b[34m0\u001b[39;49;00m ? \u001b[34m1\u001b[39;49;00m + -\u001b[34m1\u001b[39;49;00m * lid(\u001b[34m0\u001b[39;49;00m) + (\u001b[34m1\u001b[39;49;00m + \u001b[34m15\u001b[39;49;00m * lid(\u001b[34m0\u001b[39;49;00m)) / \u001b[34m16\u001b[39;49;00m : -\u001b[34m1\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + -\u001b[34m1\u001b[39;49;00m * lid(\u001b[34m0\u001b[39;49;00m) + (\u001b[34m1\u001b[39;49;00m + n + \u001b[34m15\u001b[39;49;00m * lid(\u001b[34m0\u001b[39;49;00m)) / \u001b[34m16\u001b[39;49;00m); ++u_dim_1_outer)\n",
      "      \u001b[34mif\u001b[39;49;00m (\u001b[34m17\u001b[39;49;00m + -\u001b[34m16\u001b[39;49;00m * u_dim_1_outer + -\u001b[34m1\u001b[39;49;00m * lid(\u001b[34m0\u001b[39;49;00m) >= \u001b[34m0\u001b[39;49;00m)\n",
      "        \u001b[34mfor\u001b[39;49;00m (\u001b[36mint\u001b[39;49;00m u_dim_0_outer = \u001b[34m0\u001b[39;49;00m; u_dim_0_outer <= (-\u001b[34m16\u001b[39;49;00m + n + -\u001b[34m16\u001b[39;49;00m * gid(\u001b[34m1\u001b[39;49;00m) >= \u001b[34m0\u001b[39;49;00m && -\u001b[34m1\u001b[39;49;00m + n + -\u001b[34m1\u001b[39;49;00m * lid(\u001b[34m0\u001b[39;49;00m) + -\u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) >= \u001b[34m0\u001b[39;49;00m ? \u001b[34m1\u001b[39;49;00m + -\u001b[34m1\u001b[39;49;00m * lid(\u001b[34m1\u001b[39;49;00m) + (\u001b[34m1\u001b[39;49;00m + \u001b[34m15\u001b[39;49;00m * lid(\u001b[34m1\u001b[39;49;00m)) / \u001b[34m16\u001b[39;49;00m : -\u001b[34m1\u001b[39;49;00m * gid(\u001b[34m1\u001b[39;49;00m) + -\u001b[34m1\u001b[39;49;00m * lid(\u001b[34m1\u001b[39;49;00m) + (\u001b[34m1\u001b[39;49;00m + n + \u001b[34m15\u001b[39;49;00m * lid(\u001b[34m1\u001b[39;49;00m)) / \u001b[34m16\u001b[39;49;00m); ++u_dim_0_outer)\n",
      "          \u001b[34mif\u001b[39;49;00m (\u001b[34m17\u001b[39;49;00m + -\u001b[34m16\u001b[39;49;00m * u_dim_0_outer + -\u001b[34m1\u001b[39;49;00m * lid(\u001b[34m1\u001b[39;49;00m) >= \u001b[34m0\u001b[39;49;00m)\n",
      "            u_fetch[\u001b[34m18\u001b[39;49;00m * (\u001b[34m16\u001b[39;49;00m * u_dim_0_outer + lid(\u001b[34m1\u001b[39;49;00m)) + \u001b[34m16\u001b[39;49;00m * u_dim_1_outer + lid(\u001b[34m0\u001b[39;49;00m)] = u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m16\u001b[39;49;00m * gid(\u001b[34m1\u001b[39;49;00m) + \u001b[34m16\u001b[39;49;00m * u_dim_0_outer + lid(\u001b[34m1\u001b[39;49;00m)) + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + \u001b[34m16\u001b[39;49;00m * u_dim_1_outer + lid(\u001b[34m0\u001b[39;49;00m)];\n",
      "  barrier(CLK_LOCAL_MEM_FENCE) \u001b[37m/* for u_fetch (insn depends on u_fetch_rule) */\u001b[39;49;00m;\n",
      "  \u001b[34mif\u001b[39;49;00m (-\u001b[34m1\u001b[39;49;00m + -\u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + -\u001b[34m1\u001b[39;49;00m * lid(\u001b[34m0\u001b[39;49;00m) + n >= \u001b[34m0\u001b[39;49;00m && -\u001b[34m1\u001b[39;49;00m + -\u001b[34m16\u001b[39;49;00m * gid(\u001b[34m1\u001b[39;49;00m) + -\u001b[34m1\u001b[39;49;00m * lid(\u001b[34m1\u001b[39;49;00m) + n >= \u001b[34m0\u001b[39;49;00m)\n",
      "    result[(n + \u001b[34m2\u001b[39;49;00m) * (\u001b[34m1\u001b[39;49;00m + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m1\u001b[39;49;00m) + lid(\u001b[34m1\u001b[39;49;00m)) + \u001b[34m1\u001b[39;49;00m + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + lid(\u001b[34m0\u001b[39;49;00m)] = (\u001b[34m2.0f\u001b[39;49;00m * u_fetch[\u001b[34m18\u001b[39;49;00m * (\u001b[34m1\u001b[39;49;00m + lid(\u001b[34m1\u001b[39;49;00m)) + \u001b[34m1\u001b[39;49;00m + lid(\u001b[34m0\u001b[39;49;00m)] + u_fetch[\u001b[34m18\u001b[39;49;00m * (\u001b[34m2\u001b[39;49;00m + lid(\u001b[34m1\u001b[39;49;00m)) + \u001b[34m1\u001b[39;49;00m + lid(\u001b[34m0\u001b[39;49;00m)] + u_fetch[\u001b[34m18\u001b[39;49;00m * lid(\u001b[34m1\u001b[39;49;00m) + \u001b[34m1\u001b[39;49;00m + lid(\u001b[34m0\u001b[39;49;00m)] + u_fetch[\u001b[34m18\u001b[39;49;00m * (\u001b[34m1\u001b[39;49;00m + lid(\u001b[34m1\u001b[39;49;00m)) + \u001b[34m2\u001b[39;49;00m + lid(\u001b[34m0\u001b[39;49;00m)] + u_fetch[\u001b[34m18\u001b[39;49;00m * (\u001b[34m1\u001b[39;49;00m + lid(\u001b[34m1\u001b[39;49;00m)) + lid(\u001b[34m0\u001b[39;49;00m)]) / \u001b[34m6.0f\u001b[39;49;00m;\n",
      "}\n",
      "\n"
     ]
    }
   ],
   "source": [
    "sknl = knl\n",
    "sknl = lp.split_iname(sknl,\n",
    "        \"i\", 16, outer_tag=\"g.1\", inner_tag=\"l.1\")\n",
    "sknl = lp.split_iname(sknl,\n",
    "        \"j\", 16, outer_tag=\"g.0\", inner_tag=\"l.0\")\n",
    "sknl = lp.add_prefetch(sknl, \"u\",\n",
    "    [\"i_inner\", \"j_inner\"],\n",
    "    fetch_bounding_box=True, default_tag=\"l.auto\")\n",
    "evt, (result,) = sknl(queue, u=u, n=n)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[36m#\u001b[39;49;00m\u001b[36mdefine lid(N) ((int) get_local_id(N))\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\u001b[36m#\u001b[39;49;00m\u001b[36mdefine gid(N) ((int) get_group_id(N))\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\u001b[36m#\u001b[39;49;00m\u001b[36mdefine LOOPY_CALL_WITH_INTEGER_TYPES(MACRO_NAME) \\\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\u001b[36m    MACRO_NAME(int8, char) \\\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\u001b[36m    MACRO_NAME(int16, short) \\\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\u001b[36m    MACRO_NAME(int32, int) \\\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\u001b[36m    MACRO_NAME(int64, long)\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\u001b[36m#\u001b[39;49;00m\u001b[36mdefine LOOPY_DEFINE_FLOOR_DIV_POS_B(SUFFIX, TYPE) \\\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\u001b[36m    inline TYPE loopy_floor_div_pos_b_##SUFFIX(TYPE a, TYPE b) \\\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\u001b[36m    { \\\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\u001b[36m        if (a<0) \\\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\u001b[36m            a = a - (b-1); \\\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\u001b[36m        return a\u001b[39;49;00m\u001b[36m/\u001b[39;49;00m\u001b[36mb; \\\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\u001b[36m    }\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "LOOPY_CALL_WITH_INTEGER_TYPES(LOOPY_DEFINE_FLOOR_DIV_POS_B)\n",
      "\u001b[36m#\u001b[39;49;00m\u001b[36mundef LOOPY_DEFINE_FLOOR_DIV_POS_B\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\u001b[36m#\u001b[39;49;00m\u001b[36mundef LOOPY_CALL_WITH_INTEGER_TYPES\u001b[39;49;00m\u001b[36m\u001b[39;49;00m\n",
      "\n",
      "__kernel \u001b[36mvoid\u001b[39;49;00m __attribute__ ((reqd_work_group_size(\u001b[34m8\u001b[39;49;00m, \u001b[34m1\u001b[39;49;00m, \u001b[34m1\u001b[39;49;00m))) loopy_kernel(__global \u001b[36mfloat\u001b[39;49;00m *__restrict__ result, \u001b[36mint\u001b[39;49;00m \u001b[34mconst\u001b[39;49;00m n, __global \u001b[36mfloat\u001b[39;49;00m \u001b[34mconst\u001b[39;49;00m *__restrict__ u)\n",
      "{\n",
      "  \u001b[34mif\u001b[39;49;00m (-\u001b[34m1\u001b[39;49;00m + -\u001b[34m1\u001b[39;49;00m * lid(\u001b[34m0\u001b[39;49;00m) + n >= \u001b[34m0\u001b[39;49;00m)\n",
      "    \u001b[34mfor\u001b[39;49;00m (\u001b[36mint\u001b[39;49;00m i_inner = \u001b[34m0\u001b[39;49;00m; i_inner <= (-\u001b[34m16\u001b[39;49;00m + n + -\u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) >= \u001b[34m0\u001b[39;49;00m ? \u001b[34m15\u001b[39;49;00m : -\u001b[34m1\u001b[39;49;00m + n + -\u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m)); ++i_inner)\n",
      "    {\n",
      "      \u001b[37m/* bulk slab for 'j_outer' */\u001b[39;49;00m\n",
      "      \u001b[34mfor\u001b[39;49;00m (\u001b[36mint\u001b[39;49;00m j_outer = \u001b[34m0\u001b[39;49;00m; j_outer <= -\u001b[34m2\u001b[39;49;00m + loopy_floor_div_pos_b_int32(\u001b[34m7\u001b[39;49;00m + n, \u001b[34m8\u001b[39;49;00m); ++j_outer)\n",
      "        result[(n + \u001b[34m2\u001b[39;49;00m) * (\u001b[34m1\u001b[39;49;00m + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + i_inner) + \u001b[34m1\u001b[39;49;00m + \u001b[34m8\u001b[39;49;00m * j_outer + lid(\u001b[34m0\u001b[39;49;00m)] = (\u001b[34m2.0f\u001b[39;49;00m * u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m1\u001b[39;49;00m + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + i_inner) + \u001b[34m1\u001b[39;49;00m + \u001b[34m8\u001b[39;49;00m * j_outer + lid(\u001b[34m0\u001b[39;49;00m)] + u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m2\u001b[39;49;00m + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + i_inner) + \u001b[34m1\u001b[39;49;00m + \u001b[34m8\u001b[39;49;00m * j_outer + lid(\u001b[34m0\u001b[39;49;00m)] + u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + i_inner) + \u001b[34m1\u001b[39;49;00m + \u001b[34m8\u001b[39;49;00m * j_outer + lid(\u001b[34m0\u001b[39;49;00m)] + u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m1\u001b[39;49;00m + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + i_inner) + \u001b[34m2\u001b[39;49;00m + \u001b[34m8\u001b[39;49;00m * j_outer + lid(\u001b[34m0\u001b[39;49;00m)] + u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m1\u001b[39;49;00m + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + i_inner) + \u001b[34m8\u001b[39;49;00m * j_outer + lid(\u001b[34m0\u001b[39;49;00m)]) / \u001b[34m6.0f\u001b[39;49;00m;\n",
      "      \u001b[37m/* final slab for 'j_outer' */\u001b[39;49;00m\n",
      "      \u001b[34mfor\u001b[39;49;00m (\u001b[36mint\u001b[39;49;00m j_outer = -\u001b[34m1\u001b[39;49;00m + n + -\u001b[34m1\u001b[39;49;00m * loopy_floor_div_pos_b_int32(\u001b[34m7\u001b[39;49;00m * n, \u001b[34m8\u001b[39;49;00m); j_outer <= -\u001b[34m1\u001b[39;49;00m + -\u001b[34m1\u001b[39;49;00m * lid(\u001b[34m0\u001b[39;49;00m) + (\u001b[34m7\u001b[39;49;00m + n + \u001b[34m7\u001b[39;49;00m * lid(\u001b[34m0\u001b[39;49;00m)) / \u001b[34m8\u001b[39;49;00m; ++j_outer)\n",
      "        result[(n + \u001b[34m2\u001b[39;49;00m) * (\u001b[34m1\u001b[39;49;00m + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + i_inner) + \u001b[34m1\u001b[39;49;00m + \u001b[34m8\u001b[39;49;00m * j_outer + lid(\u001b[34m0\u001b[39;49;00m)] = (\u001b[34m2.0f\u001b[39;49;00m * u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m1\u001b[39;49;00m + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + i_inner) + \u001b[34m1\u001b[39;49;00m + \u001b[34m8\u001b[39;49;00m * j_outer + lid(\u001b[34m0\u001b[39;49;00m)] + u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m2\u001b[39;49;00m + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + i_inner) + \u001b[34m1\u001b[39;49;00m + \u001b[34m8\u001b[39;49;00m * j_outer + lid(\u001b[34m0\u001b[39;49;00m)] + u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + i_inner) + \u001b[34m1\u001b[39;49;00m + \u001b[34m8\u001b[39;49;00m * j_outer + lid(\u001b[34m0\u001b[39;49;00m)] + u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m1\u001b[39;49;00m + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + i_inner) + \u001b[34m2\u001b[39;49;00m + \u001b[34m8\u001b[39;49;00m * j_outer + lid(\u001b[34m0\u001b[39;49;00m)] + u[(\u001b[34m2\u001b[39;49;00m + n) * (\u001b[34m1\u001b[39;49;00m + \u001b[34m16\u001b[39;49;00m * gid(\u001b[34m0\u001b[39;49;00m) + i_inner) + \u001b[34m8\u001b[39;49;00m * j_outer + lid(\u001b[34m0\u001b[39;49;00m)]) / \u001b[34m6.0f\u001b[39;49;00m;\n",
      "    }\n",
      "}\n",
      "\n"
     ]
    }
   ],
   "source": [
    "cpuknl = knl\n",
    "cpuknl = lp.split_iname(cpuknl, \"i\", 16, outer_tag=\"g.0\")\n",
    "cpuknl = lp.split_iname(cpuknl, \"j\", 8, inner_tag=\"l.0\", slabs=(0,1))\n",
    "cpuknl = lp.prioritize_loops(cpuknl, \"i_inner, j_outer\")\n",
    "\n",
    "evt, (result,) = cpuknl(queue, u=u, n=n)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Judgement day: Has it helped?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's time the execution of our \"blur\" operation on an actually big image. (We'll make do with random data for this timing):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "from time import time\n",
    "\n",
    "rounds = 4\n",
    "\n",
    "n = 5000\n",
    "u = cl.clrandom.rand(queue, (n+2, n+2), dtype=np.float32)\n",
    "\n",
    "uh = u.get()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, `numpy`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.1049642562866211\n"
     ]
    }
   ],
   "source": [
    "t_start = time()\n",
    "for i in range(rounds):\n",
    "    blurred_u = np.zeros_like(uh)\n",
    "    blurred_u[1:-1, 1:-1] = (\n",
    "        2*uh[1:-1, 1:-1]\n",
    "        + uh[2:, 1:-1]\n",
    "        + uh[:-2, 1:-1]\n",
    "        + uh[1:-1, 2:]\n",
    "        + uh[1:-1, 2:]\n",
    "        )/6\n",
    "\n",
    "print((time()-t_start)/rounds)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, our generated code:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.023528873920440674\n"
     ]
    }
   ],
   "source": [
    "queue.finish()\n",
    "t_start = time()\n",
    "for i in range(rounds):\n",
    "    evt, (result,) = cpuknl(queue, u=u)\n",
    "    \n",
    "queue.finish()\n",
    "codegen_time = (time()-t_start)/rounds\n",
    "print(codegen_time)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now estimate performance:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "25.500582902046617\n"
     ]
    }
   ],
   "source": [
    "pixels_accessed = 6*n**2\n",
    "bytes_accessed = pixels_accessed * 4\n",
    "gbytes_per_second = bytes_accessed / codegen_time / 1e9\n",
    "print(gbytes_per_second)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
